Skip to content

handle discovery renaming when listing resource in tctl text format#29887

Merged
GavinFrazar merged 9 commits intomasterfrom
gavinfrazar/tctl-resource-listing-ux
Aug 4, 2023
Merged

handle discovery renaming when listing resource in tctl text format#29887
GavinFrazar merged 9 commits intomasterfrom
gavinfrazar/tctl-resource-listing-ux

Conversation

@GavinFrazar
Copy link
Copy Markdown
Contributor

@GavinFrazar GavinFrazar commented Aug 2, 2023

This PR updates tctl to list resources in a text table by their "discovered name" in non-verbose mode.

changelog: tctl text-formatted output in non-verbose mode will display auto-discovered resources with original resource names instead of the more detailed names generated by the v14+ Teleport Discovery service.

Since discovery renaming only applies to databases and kube clusters currently, I only updated the output for those kinds of resources.

Updated commands:

  • tctl get [db | db_server | kube_cluster | kube_server] --format=text
  • tctl db ls
  • tctl kube ls
    • this command was also updated to support filtering by label, predicate, or search keywords

Why

RFD 129 resolves discovery resource name collisions by renaming discovered resources with a suffix that includes additional distinguishing information. However, we decided users will most of the time not want to see long resource names that include that suffix.

Related issue:

Therefore, this PR will display the original resource name in non-verbose mode, and the full name in verbose mode.

Examples:

$ tctl get db --format text
Name                              Protocol URI                                                   Labels                                                                 
--------------------------------- -------- ----------------------------------------------------- ---------------------------------------------------------------------- 
mysql-aurora                      mysql    mysql-aurora.cluster-abcdefghijkl.us-west-1.rds.am... account-id=123456789012,endpoint-type=primary,engine-version=8.0.my...
postgres-aurora                   postgres postgres-aurora.cluster-abcdefghijkl.us-west-1.rds... account-id=123456789012,endpoint-type=primary,engine-version=11.17,...
postgres-aurora-custom-customtest postgres customtest.cluster-custom-abcdefghijkl.us-west-1.r... account-id=123456789012,endpoint-type=custom,engine-version=11.17,e...
postgres-rds-2                    postgres postgres-rds.abcdefghijkl.us-west-1.rds.amazonaws.... account-id=123456789012,blah=blah,endpoint-type=instance,engine-ver...

$ tctl get db --format text --verbose
Name                                                         Protocol URI                                                                     Labels                                                                                                                                                                                                                                                                               
------------------------------------------------------------ -------- ----------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
mysql-aurora-rds-us-west-1-123456789012                      mysql    mysql-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:3306      account-id=123456789012,endpoint-type=primary,engine-version=8.0.mysql_aurora.3.03.1,engine=aurora-mysql,hello=world,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=mysql-aurora,teleport.internal/discovery-group-name=aws-dev
postgres-aurora-custom-customtest-rds-us-west-1-123456789012 postgres customtest.cluster-custom-abcdefghijkl.us-west-1.rds.amazonaws.com:5432 account-id=123456789012,endpoint-type=custom,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora-custom-customtest,teleport.internal/discovery-group-name=aws-dev
postgres-aurora-rds-us-west-1-123456789012                   postgres postgres-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:5432   account-id=123456789012,endpoint-type=primary,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora,teleport.internal/discovery-group-name=aws-dev
postgres-rds-2                                               postgres postgres-rds.abcdefghijkl.us-west-1.rds.amazonaws.com:5432              account-id=123456789012,blah=blah,endpoint-type=instance,engine-version=13.10,engine=postgres,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/database_name=postgres-rds-2,teleport.dev/origin=cloud,teleport.internal/discovery-group-name=aws-dev
$ tctl get db_server --format text
Host        Name                              Protocol URI                               Labels                                                              Version    
----------- --------------------------------- -------- --------------------------------- ------------------------------------------------------------------- ---------- 
local-agent mysql-aurora                      mysql    mysql-aurora.cluster-abcdefghi... account-id=123456789012,endpoint-type=primary,engine-version=8.0... 14.0.0-dev
local-agent postgres-aurora                   postgres postgres-aurora.cluster-abcdef... account-id=123456789012,endpoint-type=primary,engine-version=11.... 14.0.0-dev
local-agent postgres-aurora-custom-customt... postgres customtest.cluster-custom-abcd... account-id=123456789012,endpoint-type=custom,engine-version=11.1... 14.0.0-dev
local-agent postgres-rds-2                    postgres postgres-rds.abcdefghijkl.us-w... account-id=123456789012,blah=blah,endpoint-type=instance,engine-... 14.0.0-dev

$ tctl get db_server --format text --verbose
Host        Name                                                         Protocol URI                                                                     Labels                                                                                                                                                                                                                                                                               Version    
----------- ------------------------------------------------------------ -------- ----------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- 
local-agent mysql-aurora-rds-us-west-1-123456789012                      mysql    mysql-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:3306      account-id=123456789012,endpoint-type=primary,engine-version=8.0.mysql_aurora.3.03.1,engine=aurora-mysql,hello=world,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=mysql-aurora,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev
local-agent postgres-aurora-custom-customtest-rds-us-west-1-123456789012 postgres customtest.cluster-custom-abcdefghijkl.us-west-1.rds.amazonaws.com:5432 account-id=123456789012,endpoint-type=custom,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora-custom-customtest,teleport.internal/discovery-group-name=aws-dev      14.0.0-dev
local-agent postgres-aurora-rds-us-west-1-123456789012                   postgres postgres-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:5432   account-id=123456789012,endpoint-type=primary,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora,teleport.internal/discovery-group-name=aws-dev                       14.0.0-dev
local-agent postgres-rds-2                                               postgres postgres-rds.abcdefghijkl.us-west-1.rds.amazonaws.com:5432              account-id=123456789012,blah=blah,endpoint-type=instance,engine-version=13.10,engine=postgres,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/database_name=postgres-rds-2,teleport.dev/origin=cloud,teleport.internal/discovery-group-name=aws-dev                             14.0.0-dev
$ tctl db ls
Host        Name                              Protocol URI                               Labels                                                              Version    
----------- --------------------------------- -------- --------------------------------- ------------------------------------------------------------------- ---------- 
local-agent mysql-aurora                      mysql    mysql-aurora.cluster-abcdefghi... account-id=123456789012,endpoint-type=primary,engine-version=8.0... 14.0.0-dev
local-agent postgres-aurora                   postgres postgres-aurora.cluster-abcdef... account-id=123456789012,endpoint-type=primary,engine-version=11.... 14.0.0-dev
local-agent postgres-aurora-custom-customt... postgres customtest.cluster-custom-abcd... account-id=123456789012,endpoint-type=custom,engine-version=11.1... 14.0.0-dev
local-agent postgres-rds-2                    postgres postgres-rds.abcdefghijkl.us-w... account-id=123456789012,blah=blah,endpoint-type=instance,engine-... 14.0.0-dev

$ tctl db ls --verbose
Host        Name                                                         Protocol URI                                                                     Labels                                                                                                                                                                                                                                                                               Version    
----------- ------------------------------------------------------------ -------- ----------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- 
local-agent mysql-aurora-rds-us-west-1-123456789012                      mysql    mysql-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:3306      account-id=123456789012,endpoint-type=primary,engine-version=8.0.mysql_aurora.3.03.1,engine=aurora-mysql,hello=world,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=mysql-aurora,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev
local-agent postgres-aurora-custom-customtest-rds-us-west-1-123456789012 postgres customtest.cluster-custom-abcdefghijkl.us-west-1.rds.amazonaws.com:5432 account-id=123456789012,endpoint-type=custom,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora-custom-customtest,teleport.internal/discovery-group-name=aws-dev      14.0.0-dev
local-agent postgres-aurora-rds-us-west-1-123456789012                   postgres postgres-aurora.cluster-abcdefghijkl.us-west-1.rds.amazonaws.com:5432   account-id=123456789012,endpoint-type=primary,engine-version=11.17,engine=aurora-postgresql,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=postgres-aurora,teleport.internal/discovery-group-name=aws-dev                       14.0.0-dev
local-agent postgres-rds-2                                               postgres postgres-rds.abcdefghijkl.us-west-1.rds.amazonaws.com:5432              account-id=123456789012,blah=blah,endpoint-type=instance,engine-version=13.10,engine=postgres,region=us-west-1,teleport.dev/cloud=AWS,teleport.dev/database_name=postgres-rds-2,teleport.dev/origin=cloud,teleport.internal/discovery-group-name=aws-dev                             14.0.0-dev
$ tctl get kube_cluster --format text
Name     Labels                                                                                                                              
-------- ----------------------------------------------------------------------------------------------------------------------------------- 
example1 account-id=123456789012,region=eu-north-1,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev

$ tctl get kube_cluster --format text --verbose
Name                                 Labels                                                                                                                                                                               
------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
example1-eks-eu-north-1-123456789012 account-id=123456789012,region=eu-north-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev
$ tctl get kube_server --format text
Cluster  Labels                                                                                                                              Version    
-------- ----------------------------------------------------------------------------------------------------------------------------------- ---------- 
example1 account-id=123456789012,region=eu-north-1,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev

$ tctl get kube_server --format text --verbose
Cluster                              Labels                                                                                                                                                                               Version    
------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- 
example1-eks-eu-north-1-123456789012 account-id=123456789012,region=eu-north-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev
$ tctl kube ls
Cluster  Labels                                                                                                                              Version    
-------- ----------------------------------------------------------------------------------------------------------------------------------- ---------- 
example1 account-id=123456789012,region=eu-north-1,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev

$ tctl kube ls --verbose
Cluster                              Labels                                                                                                                                                                               Version    
------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- 
example1-eks-eu-north-1-123456789012 account-id=123456789012,region=eu-north-1,teleport.dev/cloud=AWS,teleport.dev/origin=cloud,teleport.internal/discovered-name=example1,teleport.internal/discovery-group-name=aws-dev 14.0.0-dev

@github-actions github-actions Bot added size/md tctl tctl - Teleport admin tool labels Aug 2, 2023
@GavinFrazar GavinFrazar requested a review from smallinsky August 2, 2023 15:35
Comment thread lib/asciitable/table.go

// SortRowsBy sorts the table rows with the given column indices as the sorting
// key, optionally performing a stable sort.
func (t *Table) SortRowsBy(colIdxKey []int, stable bool) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we validate the the ColIdx is not greater than len(t.columns) ?

@public-teleport-github-review-bot public-teleport-github-review-bot Bot removed the request for review from capnspacehook August 3, 2023 13:48
@ravicious
Copy link
Copy Markdown
Member

Is there an easy way to test those discoverable resources with a local cluster?

I suspect there's no easy way and it'd be best to set up a cluster in our Cloud + some dbs on AWS.

I only verified that regular resources still have correct names when using those tctl commands.

@GavinFrazar
Copy link
Copy Markdown
Contributor Author

it'd be best to set up a cluster in our Cloud + some dbs on AWS.

yeah this is the best way. we have databases already in several regions in our dev account, you just need to configure a discovery service in your local cluster. You can make an IAM role with the required permissions in our dev account and have the discovery service assume that role with assume_role_arn.

@GavinFrazar GavinFrazar enabled auto-merge August 3, 2023 17:53
@GavinFrazar GavinFrazar added this pull request to the merge queue Aug 4, 2023
Merged via the queue into master with commit 7a0b632 Aug 4, 2023
@GavinFrazar GavinFrazar deleted the gavinfrazar/tctl-resource-listing-ux branch August 4, 2023 18:42
@public-teleport-github-review-bot
Copy link
Copy Markdown

@GavinFrazar See the table below for backport results.

Branch Result
branch/v13 Create PR

GavinFrazar added a commit that referenced this pull request Sep 16, 2023
…format

backports #29887 to branch/v13.

* display discovered resource name in tctl output
* display the discovered name from label in non-verbose text format for
  db, db_server, kube_cluster, kube_server resources.
* support labels, predicate, search in tctl kube ls
* avoid type conversion in tctl db ls
* sort kube and db objects in tctl text tables
* test kube/database collection text format output
* check column indices are in range
GavinFrazar added a commit that referenced this pull request Sep 18, 2023
…format

backports #29887 to branch/v13.

* display discovered resource name in tctl output
* display the discovered name from label in non-verbose text format for
  db, db_server, kube_cluster, kube_server resources.
* support labels, predicate, search in tctl kube ls
* avoid type conversion in tctl db ls
* sort kube and db objects in tctl text tables
* test kube/database collection text format output
* check column indices are in range
github-merge-queue Bot pushed a commit that referenced this pull request Sep 18, 2023
#32083)

* [v13] Deflake `TestListKube`

backports #30024 to branch/v13.

* Deflake `TestListKube`
* Plumbing through custom kube config path

PR #29993 tried to deflake this test but only fixed it partially during
login.
This prevents the kubeconfig in `$HOME/.kube/config` to be used
everywhere

* [v13] handle discovery renaming when listing resource in `tctl` text format

backports #29887 to branch/v13.

* display discovered resource name in tctl output
* display the discovered name from label in non-verbose text format for
  db, db_server, kube_cluster, kube_server resources.
* support labels, predicate, search in tctl kube ls
* avoid type conversion in tctl db ls
* sort kube and db objects in tctl text tables
* test kube/database collection text format output
* check column indices are in range

---------

Co-authored-by: Tiago Silva <tiago.silva@goteleport.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/md tctl tctl - Teleport admin tool

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants